package jee.boot.module.quartz.rest;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jee.boot.common.basic.CrudController;
import jee.boot.common.basic.result.ResponseMessage;
import jee.boot.common.basic.result.Result;
import jee.boot.module.quartz.entity.Quartz;
import jee.boot.module.quartz.service.QuartzService;
import org.quartz.Job;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 任务调度Controller
 * <pre>
 *     1.定时任务模块通过restful接口api进行调用(system需要替换成自己模块的前缀)
 *     POST /api/system/quartz/get 查看
 *     {
 *           "id": "testgroup1_测试任务1"
 *      }
 *
 *     POST /api/system/quartz/list 列表
 *     {
 *
 *     }
 *
 *     POST /api/system/quartz/save 新增
 *     {
 *           "id": "testgroup1_测试任务1",
 *            "name": "测试任务1",
 *            "group": "testgroup1",
 *            "className": "jee.boot.module.quartz.task.TaskSynchDemo",
 *            "cronExpression": "0/3 * * * * ? ",
 *            "description": "任务描述",
 *            "state": "ACQUIRED"
 *      }
 *
 *     POST /api/system/quartz/update 修改
 *     {
 *           "id": "testgroup1_测试任务1",
 *            "name": "测试任务1",
 *            "group": "testgroup1",
 *            "className": "jee.boot.module.quartz.task.TaskSynchDemo",
 *            "cronExpression": "0/3 * * * * ? ",
 *            "description": "任务描述",
 *            "state": "ACQUIRED"
 *      }
 *
 *     POST /api/system/quartz/delete 删除
 *     {
 *           "id": "testgroup1_测试任务1"
 *      }
 *
 *     POST /api/system/quartz/trigger 触发(实时执行)
 *     {
 *           "id": "testgroup1_测试任务1"
 *      }
 *
 *     POST /api/system/quartz/pause 暂停
 *     {
 *           "id": "testgroup1_测试任务1"
 *      }
 *
 *     POST /api/system/quartz/resume 恢复
 *     {
 *           "id": "testgroup1_测试任务1"
 *      }
 *
 * </pre>
 * <pre>
 *     2.任务的数据结构
 *     {
 *           "id": "testgroup1_测试任务1", //视图生成的id,虚拟主键
 *            "name": "测试任务1", // 任务名称
 *            "group": "testgroup1", //任务分组
 *            "className": "jee.boot.module.quartz.task.TaskSynchDemo", //任务的执行类
 *            "cronExpression": "0/3 * * * * ? ", //cron表达式
 *            "description": "任务描述", //任务描述
 *            "state": "ACQUIRED" //任务状态 WAITING:等待; PAUSED:暂停; ACQUIRED:正常执行; BLOCKED：阻塞; ERROR：错误
 *      }
 * </pre>
 * <pre>
 *     3.关于同步任务,异步任务
 *     异步任务: 同一个任务(name+group确定一个任务) 之间不会相互影响,独立执行,比如第一次任务执行还没有结束,第二次的执行时间到了,那么第二次任务会开始执行,不会上一次任务的影响
 *     同步任务: 同一个任务(name+group确定一个任务) 等待执行,比如第一次任务执行还没有结束,第二次的执行时间到了,那么第二次会等待第一次执行结束后才会执行下一次
 *     className": "jee.boot.module.quartz.task.TaskSynchDemo", //任务的执行类
 *     这个类需要实现{@link Job} 默认是异步任务,如果需要同步执行需要在执行类中增加两个注解
 *     @PersistJobDataAfterExecution
 *     @DisallowConcurrentExecution
 *
 * </pre>
 * <pre>
 *     application.yml增加配置
 *       ####################定时任务配置###################
 * spring:
 *   quartz:
 *     #相关属性配置
 *     properties:
 *       org:
 *         quartz:
 *           scheduler:
 *             instanceName: clusteredScheduler
 *             instanceId: AUTO
 *           jobStore:
 *             class: org.quartz.impl.jdbcjobstore.JobStoreTX
 *             driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
 *             tablePrefix: QRTZ_
 *             isClustered: true
 *             clusterCheckinInterval: 10000
 *             useProperties: false
 *           threadPool:
 *             class: org.quartz.simpl.SimpleThreadPool
 *             threadCount: 10
 *             threadPriority: 5
 *             threadsInheritContextClassLoaderOfInitializingThread: true
 *     #数据库方式
 *     job-store-type: jdbc
 * </pre>
 * @author zhilei.wang
 * @version 2018-01-25
 */
@Api(tags = "任务调度")
@RestController
@RequestMapping(value = "/quartz")
public class QuartzRestController extends CrudController<QuartzService, Quartz> {

    /**
     * 触发定时任务
     *
     * @param entity
     * @return
     */
    @PostMapping("/trigger")
    @ApiOperation(value = "触发定时任务")
    public ResponseMessage<Quartz> trigger(@RequestBody Quartz entity) {
        service.trigger(entity);
        return Result.success(entity);
    }
    /**
     * 暂停定时任务
     *
     * @param entity
     * @return
     */
    @PostMapping("/pause")
    @ApiOperation(value = "暂停定时任务")
    public ResponseMessage<Quartz> pause(@RequestBody Quartz entity) {
        service.pause(entity);
        return Result.success(entity);
    }
    /**
     * 恢复定时任务
     *
     * @param entity
     * @return
     */
    @PostMapping("/resume")
    @ApiOperation(value = "恢复定时任务")
    public ResponseMessage<Quartz> resume(@RequestBody Quartz entity) {
        service.resume(entity);
        return Result.success(entity);
    }
}
